home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / machack / Hacks97 / WarriorsProgress.sit / Warrior’s Progress / source code / Source / Libraries / Strings / Numeral.cp < prev    next >
Text File  |  1997-06-28  |  3KB  |  164 lines

  1. // Numeral.cp
  2.  
  3. #ifndef Numeral_h
  4. #include "Numeral.h"
  5. #endif
  6. #ifndef Assert_h
  7. #include "Assert.h"
  8. #endif
  9.  
  10. uint8 Numeral::Sign( int32 value )
  11.   {
  12.     return ( value < 0 )
  13.              ? minus
  14.              : ( value == 0 ) ? none : plus;
  15.   }
  16.  
  17. uint8 Numeral::Sign( uint32 value )
  18.   {
  19.     return ( value == 0 ) ? none : plus;
  20.   }
  21.  
  22. Numeral::Numeral( uint64 value, uint32 base )
  23.   : sign( Sign( value ) ),
  24.      showSign( 0 ),
  25.      firstDigit( digits + maxLength )
  26.   {
  27.     MakeDigits64( value, base );
  28.   }
  29.  
  30. Numeral::Numeral( int64 value, uint32 base )
  31.   : sign( Sign( value ) ),
  32.      showSign( value < 0 ),
  33.      firstDigit( digits + maxLength )
  34.   {
  35.     if ( value < 0 )
  36.         value = - value;
  37.     
  38.     MakeDigits64( value, base );
  39.   }
  40.  
  41. Numeral::Numeral( uint32 value, uint32 base )
  42.   : sign( Sign( value ) ),
  43.      showSign( 0 ),
  44.      firstDigit( digits + maxLength )
  45.   {
  46.     MakeDigits( value, base );
  47.   }
  48.  
  49. Numeral::Numeral( int32 value, uint32 base )
  50.   : sign( Sign( value ) ),
  51.      showSign( value < 0 ),
  52.      firstDigit( digits + maxLength )
  53.   {
  54.     if ( value < 0 )
  55.         value = - value;
  56.     
  57.     MakeDigits( value, base );
  58.   }
  59.  
  60. Numeral::Numeral( uint16 value, uint32 base )
  61.   : sign( Sign( uint32( value ) ) ),
  62.      showSign( 0 ),
  63.      firstDigit( digits + maxLength )
  64.   {
  65.     MakeDigits( value, base );
  66.   }
  67.  
  68. Numeral::Numeral( int16 value, uint32 base )
  69.   : sign( Sign( int32( value ) ) ),
  70.      showSign( value < 0 ),
  71.      firstDigit( digits + maxLength )
  72.   {
  73.     if ( value < 0 )
  74.         value = - value;
  75.     
  76.     MakeDigits( value, base );
  77.   }
  78.  
  79. Numeral::Numeral( uint8 value, uint32 base )
  80.   : sign( Sign( uint32( value ) ) ),
  81.      showSign( 0 ),
  82.      firstDigit( digits + maxLength )
  83.   {
  84.     MakeDigits( value, base );
  85.   }
  86.  
  87. Numeral::Numeral( int8 value, uint32 base )
  88.   : sign( Sign( int32( value ) ) ),
  89.      showSign( value < 0 ),
  90.      firstDigit( digits + maxLength )
  91.   {
  92.     if ( value < 0 )
  93.         value = - value;
  94.     
  95.     MakeDigits( value, base );
  96.   }
  97.  
  98. uint8 Numeral::Digit( uint32 n )
  99.   {
  100.     Assert( n < 36 );
  101.     
  102.     if ( n < 10 )
  103.         return '0' + n;
  104.     
  105.     return 'a' + n - 10;
  106.   }
  107.  
  108. void Numeral::MakeDigits( uint32 value, uint32 base )
  109.   {
  110.     Assert( base > 1 );
  111.     Assert( base <= 36 );
  112.     
  113.     do
  114.       {
  115.         *--firstDigit = Digit( value % base );
  116.         value /= base;
  117.       }
  118.      while( value > 0 );
  119.   }
  120.  
  121. void Numeral::PadTo( uint32 minDigits )
  122.   {
  123.     Assert( minDigits <= maxLength - 2 );
  124.     
  125.     while ( DigitCount() < minDigits )
  126.         *--firstDigit = '0';
  127.   }
  128.  
  129. Numeral::operator ConstStr255Param() const
  130.   {
  131.     uint8 *stringStart = firstDigit;
  132.     if ( showSign )
  133.         *--stringStart = sign;
  134.     
  135.     uint32 length = digits + maxLength - stringStart;
  136.     *--stringStart = length;
  137.     return stringStart;
  138.   }
  139.  
  140. uint8 Numeral::Sign( int64 value )
  141.   {
  142.     return ( value < 0 )
  143.              ? minus
  144.              : ( value == 0 ) ? none : plus;
  145.   }
  146.  
  147. uint8 Numeral::Sign( uint64 value )
  148.   {
  149.     return ( value == 0 ) ? none : plus;
  150.   }
  151.  
  152. void Numeral::MakeDigits64( uint64 value, uint32 base )
  153.   {
  154.     Assert( base > 1 );
  155.     Assert( base <= 36 );
  156.     
  157.     do
  158.       {
  159.         *--firstDigit = Digit( value % base );
  160.         value /= base;
  161.       }
  162.      while( value > 0 );
  163.   }
  164.